home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Mac Format 1994 October
/
Macformat17.cdr
/
Shareware City
/
Developers
/
MacVogl-alpha1PPC
/
viewp.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-07-11
|
4KB
|
180 lines
#include <stdio.h>
#include "vogl.h"
static Vstack *vsfree = (Vstack *)NULL;
/*
* pushviewport
*
* pushes the current viewport on the viewport stack
*
*/
void
pushviewport()
{
Vstack *nvport;
Token *tok;
if (!vdevice.initialised)
verror("pushviewport: vogl not initialised");
if (vdevice.inobject) {
tok = newtokens(1);
tok->i = PUSHVIEWPORT;
return;
}
if (vsfree != (Vstack *)NULL) {
nvport = vdevice.viewport;
vdevice.viewport = vsfree;
vsfree = vsfree->back;
vdevice.viewport->back = nvport;
vdevice.viewport->v.left = nvport->v.left;
vdevice.viewport->v.right = nvport->v.right;
vdevice.viewport->v.bottom = nvport->v.bottom;
vdevice.viewport->v.top = nvport->v.top;
} else {
nvport = (Vstack *)vallocate(sizeof(Vstack));
nvport->back = vdevice.viewport;
nvport->v.left = vdevice.viewport->v.left;
nvport->v.right = vdevice.viewport->v.right;
nvport->v.bottom = vdevice.viewport->v.bottom;
nvport->v.top = vdevice.viewport->v.top;
vdevice.viewport = nvport;
}
}
/*
* popviewport
*
* pops the top viewport off the viewport stack.
*
*/
void
popviewport()
{
Token *tok;
Vstack *nvport;
if (!vdevice.initialised)
verror("popviewport: vogl not initialised");
if (vdevice.inobject) {
tok = newtokens(1);
tok->i = POPVIEWPORT;
return;
}
if (vdevice.viewport->back == (Vstack *)NULL)
verror("popviewport: viewport stack underflow");
else {
nvport = vdevice.viewport;
vdevice.viewport = vdevice.viewport->back;
nvport->back = vsfree;
vsfree = nvport;
}
vdevice.maxVx = vdevice.viewport->v.right * vdevice.sizeSx;
vdevice.maxVy = vdevice.viewport->v.top * vdevice.sizeSy;
vdevice.minVx = vdevice.viewport->v.left * vdevice.sizeSx;
vdevice.minVy = vdevice.viewport->v.bottom * vdevice.sizeSy;
CalcW2Vcoeffs();
}
/*
* viewport
*
* Define a Viewport in Normalized Device Coordinates
*
* The viewport defines that fraction of the screen that the window will
* be mapped onto. Unlike in VOGLE the screen dimension is from 0 to sizeX
* and 0 to sizeY.
*/
void
viewport(xlow, xhigh, ylow, yhigh)
Screencoord xlow, xhigh, ylow, yhigh;
{
Token *tok;
char buf[35];
if (!vdevice.initialised)
verror("viewport: vogl not initialised");
/*
* A few preliminary checks ....
*/
if (xlow < 0 || xhigh < 0) {
sprintf(buf,"viewport: x dimension value is invalid");
verror(buf);
}
if (ylow < 0 || yhigh < 0) {
sprintf(buf,"viewport: y dimension value is invalid");
verror(buf);
}
if (xlow >= xhigh) {
sprintf(buf,"viewport: xleft(%d) >= xright(%d)", xlow, xhigh);
verror(buf);
}
if (ylow >= yhigh) {
sprintf(buf,"viewport: ybottom(%d) >= ytop(%d)", ylow, yhigh);
verror(buf);
}
if (vdevice.inobject) {
tok = newtokens(5);
tok[0].i = VIEWPORT;
tok[1].i = xlow;
tok[2].i = xhigh;
tok[3].i = ylow;
tok[4].i = yhigh;
return;
}
if (xhigh >= vdevice.sizeSx)
xhigh = vdevice.sizeSx;
if (yhigh >= vdevice.sizeSy)
yhigh = vdevice.sizeSy;
/*
* Make sure the viewport stack knows about us.....
*/
vdevice.viewport->v.left = xlow / (double)vdevice.sizeSx;
vdevice.viewport->v.right = xhigh / (double)vdevice.sizeSx;
vdevice.viewport->v.bottom = ylow / (double)vdevice.sizeSy;
vdevice.viewport->v.top = yhigh / (double)vdevice.sizeSy;
vdevice.minVx = xlow;
vdevice.minVy = ylow;
vdevice.maxVx = xhigh;
vdevice.maxVy = yhigh;
CalcW2Vcoeffs();
}
/*
* getviewport
*
* Returns the left, right, bottom and top limits of the current
* viewport.
*/
void
getviewport(left, right, bottom, top)
Screencoord *left, *right, *bottom, *top;
{
*right = vdevice.maxVx;
*top = vdevice.maxVy;
*left = vdevice.minVx;
*bottom = vdevice.minVy;
}